#ifndef VIEWPORT_H_
#define VIEWPORT_H_

#include "SDL/SDL.h"

#include "gui/objects/GUIMap.h"
#include "gui/objects/GUIObject.h"
#include "gui/util/ReusableScreenPortion.h"
#include "gui/GUIEngine.h"
#include "util/LinkedList.h"

namespace gui {

/*
 * Enumerado para definir el tipo de movimiento que se quiere de la pantalla.
 */
enum ViewportMove {
	Ini, MoveUp, MoveDown, MoveLeft, MoveRight, None
};

/*
 * Clase que representa la ventana en la que se ve lo que la aplicacion grafica muestra.
 */
class Viewport {
public:

	/* Constructor */
	Viewport(GUIMap* guiMap, int width, int height, int scrollSpeed);

	/* Destructor */
	virtual ~Viewport();

	/* Setea la velocidad de movimiento del viewport al hacer scroll. */
	virtual void setScrollSpeed(int scrollSpeed);

	/* Metodo para mover el viewport en una direccion. */
	virtual void moveViewport(ViewportMove horizontalMovement, ViewportMove verticalMovement);

	/* Metodo para recuperar las dimensiones de la porcion de pantalla a reutilizar. */
	virtual ReusableScreenPortion getCurrentReusableScreenPortion();

	/* Recupera los objetos que tienen que ser dibujados. */
	virtual util::LinkedList<GUIObject*>* getObjectsToDraw();

	// TODO task 33
	virtual Portion getPortionToDraw();
	virtual Portion getPortionLocation();
	virtual GUIMap* getGUIMap();
	// TODO fin task 33

private:
	int height;
	int width;
	int scrollSpeed;
	ReusableScreenPortion screenPortionToReuse;
	GUIMap* guiMap;

	util::LinkedList<GUIObject*>* getObjectsFromMap(Portion portion);

	bool checkForLimits(Portion portion, int xMove, int yMove);

	// si el scroll predefinido excede los limites de la pantalla, se adapta el desplazamiento
	// de manera que frene justo en el limite del mapa
	void adaptScrollToLimits(Portion portion, int* xMoveOriginal, int* yMoveOriginal);

	// TODO task 33
	Portion portionToDraw;
	Portion portionLocation;
	// TODO fin task 33

};

}

#endif /* VIEWPORT_H_ */
